const fs = require('fs');
const path = require('path');
const glob = require('glob');
const XLSX = require('xlsx');

// 存储中文字符的数组
const chineseWords = [];

// 检查是否为中文字符的正则表达式
const isChinese = /[\u4e00-\u9fa5]+/g;

// 排除注释和console.log的正则表达式
// const isComment = /(\/\/.*|\/\*[\s\S]*?\*\/)/gm;
const isComment = /(\/\/.*|\/\*[\s\S]*?\*\/|<!--.*?-->)/gm;
const isConsoleLog = /console\.log\(.*?\)/gm;

const wordObj = {}
module.exports = function extractChinese () {
  let file = 'test-demo'
  file = 'dist-prod'
  // 遍历目录下的所有JS和HTML文件
  glob(`./${file}/**/*.{js,html}`, { ignore: '**/node_modules/**' }, (err, files) => {
    if (err) throw err;
    console.log('js:', files)
    processFiles(files);
    console.log('wordObj', wordObj);
    console.log('Excel文件已生成，包含提取的中文词库。');
  });
}

// 遍历合协vue项目的源码，并抽出每一个js文件第一行的注释和该文件的url
module.exports = function extractChinese1 (params, fn) {
  let file = ''
  // debugger
  if (params.type === '1') {
    file = '../../../work/quanYou/qy-cloud/src'
  } else {
    file = '../../../work/quanYou/qy-mobile/src'
  }
  const url = `${file}/**/*.{js,html,vue}`
  // debugger
  console.log('url:', url)
  // debugger
  // 遍历目录下的所有JS和HTML文件 ['/**/node_modules/**','/api/**.js']
  glob(url, { ignore: '**/backup--**' }, (err, files) => {
    if (err) throw err;
    console.log('12js:', files.length)
    processFiles1(params, files, fn)
  });
}



// // 定义一个函数来写入日志
// function writeLog (message) {
//   // 使用fs.appendFile来追加日志信息到文件
//   fs.appendFile('log.txt', message + '\n', function (err) {
//     if (err) {
//       console.error('写入日志文件时发生错误:', err);
//     } else {
//       console.log('日志已写入文件');
//     }
//   });
// }

function processFiles1 (params, files, fn) {
  const clientType = params.type
  const isContainKSF = params.ksf === '1'
  const isContainPPV = params.ppv === '1'
  console.log('processFiles1222:');
  let total = files.length // 总的文件数量
  let effectiveCount = 0 // 有效文件数量(不包含ksf和ppv)
  let excuteNum = 0 // 多语言版本，已覆盖的数量(不包含ksf和ppv)
  let fileNum1 = 0// 抽出文件路径
  let ksfTotal = 0 // ksf有效文件
  let ksfExcuteNum = 0 // ksf已处理的个数
  let ppvTotal = 0 // ppv有效文件
  let ppvExcuteNum = 0 // ksf已处理的个数
  // const totalArr = [] // 需要处理的文件数量
  // const processedArr = [] // 已处理
  // const todoArr = [] // 暂没处理的

  const keyObj = {
    totalArr: [], // 需要处理的文件数量
    processedArr: [], // 已处理
    todoArr: [], // 暂没处理的
    ppv: [],
    ksf: []
  }
  recursionArr(files, 0, (file, cb) => {
    const t = file.split('/src/');
    const filePath = t[1].toLowerCase()
    fileNum1++

    const strArr = [
      'backup',
      'test-demo',
      'api/',
      '/store/',
      '/progressflow/',
    ]
    // false.统计不包含ksf
    if (!isContainKSF) {
      // strArr.push('/ksf-achievements/')
      strArr.push('ksf')
    }
    // false.统计不包含ppv
    if (!isContainPPV) {
      // strArr.push('/ppv-achievements/')
      strArr.push('ppv')
    }

    let isNoPass = false
    strArr.some(val => {
      if (filePath.indexOf(val) > -1) {
        isNoPass = true
        return true
      }
    })
    // const isNoPass = filePath.indexOf('backup--') > -1 || filePath.indexOf('test-demo') > -1 || filePath.indexOf('api/') > -1 || filePath.indexOf('/ksf') > -1 || filePath.indexOf('/ppv') > -1 || filePath.indexOf('/store/') > -1 || filePath.indexOf('/progressflow/') > -1

    // if (filePath === 'views/front/ksf-achievements/my-k-target/k-target-plan-week/index.vue') {
    //   debugger
    // }

    if (isNoPass) {
      cb && cb()
      return
    }


    const isKsf = filePath.indexOf('ksf') > -1
    const isPpv = filePath.indexOf('ppv') > -1
    fs.readFile(file, 'utf8', (err, data) => {
      if (err) {
        console.error(err)
        throw err
      };
      // 移除注释和console.log
      const isExist = /i18nFn/.test(data) || /i18nKey/gi.test(data)
      let txt = isExist ? '已国际化' : ''
      if (isKsf && isContainKSF) { // ksf
        ksfTotal++
        isExist && ksfExcuteNum++
        keyObj.ksf.push([[txt], [filePath]]);
      } else if (isPpv && isContainPPV) { // ppv
        ppvTotal++
        isExist && ppvExcuteNum++
        keyObj.ppv.push([[txt], [filePath]]);
      } else {
        if (isExist) { // 已国际化处理的
          excuteNum++
          keyObj.processedArr.push([[txt], [filePath]]);
        } else { // 未国际化处理的
          keyObj.todoArr.push([[txt], [filePath]]);
        }

        effectiveCount++
        keyObj.totalArr.push([[txt], [filePath]]);
      }

      // 所有的

      if (files.length === fileNum1) {
        console.clear('')
        console.log('fileNum1=', fileNum1, ', effectiveCount=', effectiveCount, ',excuteNum=', excuteNum);
        // console.log('keyObj.totalArr', keyObj.totalArr);
        if (keyObj.totalArr.length > 0) {
          const rate = ((excuteNum / keyObj.totalArr.length) * 100).toFixed(2) + '%' // 已处理占比
          const rate1 = ((keyObj.todoArr.length / keyObj.totalArr.length) * 100).toFixed(2) + '%'// 未处理占比
          const pendingNum = effectiveCount - excuteNum // 待处理个数
          const ksfRate1 = ((ksfExcuteNum / keyObj.ksf.length) * 100).toFixed(2) + '%' // ksf已处理的占比
          const ppvRate1 = ((ppvExcuteNum / keyObj.ppv.length) * 100).toFixed(2) + '%' // ppv已处理的占比

          keyObj.totalArr.unshift([effectiveCount + '', `${excuteNum}(${rate})`, `${pendingNum}(${rate1})`])
          keyObj.totalArr.unshift(['总数(不含ksf,ppv)', '已处理(%)', '未处理(%)'])


          keyObj.processedArr.unshift([excuteNum + '', `${rate}%`, ''])
          keyObj.processedArr.unshift(['已处理总数(不含ksf,ppv)', '占比'])

          keyObj.todoArr.unshift([pendingNum + '', `${rate1}%`, ''])
          keyObj.todoArr.unshift(['未处理总数(不含ksf,ppv)', '占比', ''])

          if (isContainKSF) {
            keyObj.ksf.unshift([ksfTotal + '', `${ksfExcuteNum}(${ksfRate1})`, `${ksfTotal - ksfExcuteNum}(${100 - parseInt(ksfRate1)}%)`])
            keyObj.ksf.unshift(['ksf总数', '已处理(%)', '未处理(%)'])
          }

          if (isContainPPV) {
            keyObj.ppv.unshift([ppvTotal + '', `${ppvExcuteNum}(${ppvRate1})`, `${ppvTotal - ppvExcuteNum}(${100 - parseInt(ppvRate1)}%)`])
            keyObj.ppv.unshift(['ppv总数', '已处理(%)', '未处理(%)'])
          }

          const fileTxt = clientType === '1' ? 'pc' : 'app'
          // debugger
          writeExcel([keyObj.totalArr, keyObj.processedArr, keyObj.todoArr, keyObj.ksf, keyObj.ppv], `合协(${fileTxt})端源码多语言处理情况统计`);
          fn && fn({ excuteNum, total, effectiveCount, disNum: total - effectiveCount, rate, ksf: keyObj.ksf, ppv: keyObj.ppv, })
        }
      } else {
        cb && cb()
      }
    });
  })
}

function recursionArr (arr, index, fn) {
  if (index < arr.length) {
    const item = arr[index]
    fn && fn(item, () => {
      recursionArr(arr, ++index, fn)
    })

    // return
  }
}

// 写入excel
function writeExcel (arr, xlsName) {
  // console.log('writeExcel111', xlsName, arr);
  // const workbookArr = []
  const sheetName = ['所有', '已处理', '暂没处理', 'KSF', 'PPV']
  // 创建一个新的工作簿
  const workbook = XLSX.utils.book_new();
  arr.forEach((sheet1, index) => {

    // 将数据转换为工作表对象
    const worksheet = XLSX.utils.aoa_to_sheet([]);

    // 设置列宽
    const cols = [{ wpx: 160 }, { wpx: 100 }, { wpx: 100 }];
    worksheet['!cols'] = cols;

    // debugger
    // 将每个中文词汇作为单独的一行输出
    sheet1.forEach((word, index) => {
      // console.log(index, word);
      // 第一行作为标题行
      if (index === 0) {
        XLSX.utils.sheet_add_aoa(worksheet, [['中文词库']], { origin: -2 }); // 将 JS 数据数组添加到现有工作表中
      }
      // 每个词汇占据新的一行，从A列开始
      XLSX.utils.sheet_add_aoa(worksheet, [word], { origin: -1 }); // 将 JS 数据数组添加到现有工作表中
    });

    // 将worksheet添加到workbook中
    XLSX.utils.book_append_sheet(workbook, worksheet, sheetName[index]);
  })


  const date = new Date();
  const year = date.getFullYear();
  const month = date.getMonth() + 1;
  const day = date.getDate();
  const hour = date.getHours();
  const minute = date.getMinutes();
  const dateTime = `${year}-${month}-${day}_${hour}-${minute}`;
  const fileName = `${xlsName}${dateTime}.xlsx`;
  // 写入Excel文件
  XLSX.writeFile(workbook, fileName);
  console.log('Excel文件已生成完毕');
}